package com.tianyi.proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

//经纪人需要实现一个MethodInterceptor接口
public class JingjiRen implements MethodInterceptor {

	//得到了LiuDeHua的子类对象，相当于间接持有了父类的引用
	public Object getInstance(Class clazz) {

		// 准备给被代理类生成一个子类对象

		Enhancer enhancer = new Enhancer();

		// 告诉即将生成的子类，其父类为什么
		enhancer.setSuperclass(clazz);

		// 设置回掉
		enhancer.setCallback(this);

		// 这句代码做了生成源代码，编译成class文件，加载到JVM，并返回一个LiuDeHua的子类对象
		return enhancer.create();

	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		// 把经纪人所要做的事情添加到被代理人要做的事情前后

		System.out.println("cglib方式实现动态代理，被代理对象无需实现一个接口，主要用的是子类对象");
		System.out.println("我是刘德华的经纪人，刘天王需要开一场演唱会");
		System.out.println("时间定于6月1号儿童节，地点是南京奥体中心");
		System.out.println("需要买票的可以联系我");
		System.out.println("----------");

		//注意该处需要调用父类的方法，不然会陷入死循环
		proxy.invokeSuper(obj, args);
		
		System.out.println("----------");
		System.out.println("演唱会结束，需要刘德华签名照的可以联系我");
		System.out.println("刘德华说感谢所有粉丝的支持，大家辛苦了");

		return null;
	}

}
